#include "ThreadPool.h"
#include <iostream>

int sum(int a, int b) { return a + b; }

int sumThree(int a, int b, int c) {
  return a + b + c;  
}

int main() {
  // ThreadPool pool;
  // // pool.setMode(PoolMode::MODE_CACHED);
  // pool.setTaskQueMaxThreshHold(1);
  // pool.start(1);

  // auto r1 = pool.submitTask(sum, 1, 2);
  // auto r2 = pool.submitTask(sumThree, 1, 2, 3);
  // auto r3 = pool.submitTask([](int a, int b, int c) { return a+ b + c;}, 1, 2, 3);
  // auto r4 = pool.submitTask(
  //     [](int a, int b, int c) {
  //       std::this_thread::sleep_for(std::chrono::seconds(4));
  //       return a + b + c;
  //     },
  //     4, 5, 6);
  // auto r5 = pool.submitTask(
  //     [](int a, int b, int c) {
  //       std::this_thread::sleep_for(std::chrono::seconds(4));
  //       return a + b + c;
  //     },
  //     4, 5, 6);
  

  // std::cout << "r1:" << r1.get() << "\n";
  // std::cout << "r2:" << r2.get() << "\n";
  // std::cout << "r3:" << r3.get() << "\n";
  // std::cout << "r4:" << r4.get() << "\n";
  // std::cout << "r5:" << r5.get() << "\n";

  // auto r6 = pool.submitTask(
  //     [](int a, int b, int c) {
  //       std::this_thread::sleep_for(std::chrono::seconds(4));
  //       return a + b + c;
  //     },
  //     4, 5, 6);
  // auto r7 = pool.submitTask(
  //     [](int a, int b, int c) {
  //       std::this_thread::sleep_for(std::chrono::seconds(4));
  //       return a + b + c;
  //     },
  //     4, 5, 6);
  // auto r8 = pool.submitTask(
  //     [](int a, int b, int c) {
  //       std::this_thread::sleep_for(std::chrono::seconds(4));
  //       return a + b + c;
  //     },
  //     4, 5, 6);
  // std::cout << "r6:" << r6.get() << "\n";
  // std::cout << "r7:" << r7.get() << "\n";
  // std::cout << "r8:" << r8.get() << "\n";

  ThreadPool pool;
  pool.setTaskQueMaxThreshHold(1);
  pool.start(1); // 只开一个工作线程

  auto slowTask = []() {
      std::this_thread::sleep_for(std::chrono::seconds(1));
  };

  // 快速提交多次，让队列爆满
  for (int i = 0; i < 20; ++i) {
      auto fut = pool.submitTask(slowTask);
      fut.get();
      auto fut1 = pool.submitTask(slowTask);
      fut1.get();
      auto fut2= pool.submitTask(slowTask);
      fut2.get();
  }

  return 0;
}